{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RDKit: making new molecules using reaction SMARTS"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook explores using `RDKit` to define chemical reactions and to use these reactions to create new molecules from existing reactants. It uses RDKit's SMARTS matches.  This notebook isn't a replacment for the [rdkit documentation](http://www.rdkit.org/docs/), but is intended to complement it."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "@TAGS: #basics #reactions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "# import rdkit components\n",
    "from rdkit import rdBase\n",
    "from rdkit import Chem\n",
    "from rdkit.Chem import AllChem\n",
    "from rdkit.Chem import Draw\n",
    "from rdkit.Chem import rdMolDescriptors\n",
    "\n",
    "# use IPythonConsole for pretty drawings\n",
    "from rdkit.Chem.Draw import IPythonConsole\n",
    "\n",
    "## The next line is commented out \n",
    "### because GitHub does not render svg's embedded in notebooks\n",
    "# IPythonConsole.ipython_useSVG=True\n",
    "IPythonConsole.ipython_useSVG=False\n",
    "\n",
    "# for flattening tuples and lists\n",
    "from itertools import chain"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# An example unimolecular reaction: the oxidation of alcohols to ketones\n",
    "\n",
    "It's easy to get a feel for how the system works with some simple examples.  Let's take the oxidation of alcohols to ketones/aldehydes.  In real life, these reactions are not really unimolecular.  The electrons and hydrogen atoms that leave during the oxidation have to go somewhere.  But in these examples we aren't tracking the fate of those atoms; we're only tracking the transformations that happen to a single rdkit molecule.  That's what we mean by unimolecular."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAADICAYAAAB758tPAABPH0lEQVR4nO3dd1iT5/4G8JsNAk4c\nFbVSlKXiHjgrx7YuurHtqaBdctSWBEfBCWpVqB4M1mrxdIG2x0qn4jri3lpFRVnugeIoIEN2nt8f\n+Zlq64hIeJJwf66LSyDvG+42gbzffJ9hJoQQICIiIiIiIiKpzGUHICIiIiIiIiIW6EREREREREQG\ngQU6ERERERERkQFggU5ERERERERkAFigExEREdUmcXFAr16Ag4Pmo1cv4Ntv/36cmdnD7+dRtxMR\n0WOzlB2AiIiIiGrI2LHAvn1AZCTQt6+myN6zBwgNBQ4cAJYtk52QiKhWM+M2a0RERES1wG+/AVOm\nAAcPajrndyssBLp3B6KigBdf1HzPzAx42GXio24nIqLHxiHuRERERLXBF18A4eF/L84BzffCwzXH\nEBGRNOygExEREdUGTk5AairQpMn9b8/OBjp0AG7c0HzNDjoRUY1jgU5ERERUG1haAiUlmn/vp7wc\nqFNH8y+g2yJwvIwkIqpWHOJOREREVBvUrw/k5Dz49pwczTF3E+LBH0REVO1YoBMRERHVBt26Adu2\nPfj2bds0xxARkTQs0ImIiIhqg6AgYPZsoKjo77cVFQFz5miOISIiaVigExEREdUGr7wC9O4N9O8P\n/O9/mqL89m0gKUnzvT59gJdflp2SiKhW4yJxRERERLXJN99otlM7cULzdfv2ms75u+/ee5yZGVBW\nBixdCjRtCrz55t9v52UkEVG1YoFORERERPf388/Aa68BzZoBmZmAo6PsREREJo1D3InIcMTFAb16\nAQ4Omo9evYBvv/37cY/a+keXrYGIiOjRXn0VGDBAs0d6RITsNEREJo8ddCIyDGPHAvv2AZGRQN++\nmiJ7zx4gNFRTqC9b9uexjxpWyWGXRETV5+hRzeru5uZASgrg7i47ERGRyWIHnYjk++03YMcOYPdu\nYPBgTffc3h54/nlg1y5g+3ZgzRrZKYmIaqdOnTTz08vLgYkTZachIjJp7KATkXxDhgCjRwNvvHH/\n21etAuLjgfXrNV+zg05EVLOuX9d0zvPyNH+LhwyRnYiIyCSxg05E8h06BAwc+ODbn31WcwwREcnR\npAkwfbrm8wkTNN10IiKqduygE5F8lpZASYnm3/spLwfq1PnzglCXReD4p42IqHqVlwMdOgAZGcCi\n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\nNl1iKMkX+ocAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=1000x200 at 0x7FF09DB5EB00>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ethanol = Chem.MolFromSmiles('CCO')\n",
    "isopropanol = Chem.MolFromSmiles('CC(C)O')\n",
    "phenol = Chem.MolFromSmiles('c1cccc(O)c1')\n",
    "t_butanol = Chem.MolFromSmiles('C(C)(C)(C)O')\n",
    "glycerol = Chem.MolFromSmiles('OCC(O)CO')\n",
    "\n",
    "alcohols = [ethanol, isopropanol, phenol, t_butanol, glycerol]\n",
    "\n",
    "Draw.MolsToGridImage(alcohols, molsPerRow=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A very general reaction definition\n",
    "\n",
    "There are a few ways we could imagine defining the reaction.  We'll take the most general way imaginable first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "rxn_1 = AllChem.ReactionFromSmarts('[#6:1]([O:2])>>[#6:1](=[O:2])')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This definition says:\n",
    "\n",
    "  1. Take _any_ carbon atom, which we'll label as atom #1, whether aliphatic or aromatic, that ...\n",
    "  2. ... is bound via a single bond to an aliphatic oxygen atom (capital O), that we label as atom #2, and\n",
    "  3. transform the linkage between these atoms to be a double bond.\n",
    "  \n",
    "This is an OK definition, but it is going to run into problems.  Phenol and $t$-butanol don't oxidize, because if they did it would either disrupt aromaticity or result in a pentavalent carbon.  rdkit has ways of letting us know about this, as we shall see.\n",
    "\n",
    "First, we have to run the reaction.  Let's show it working on isopropanol."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((<rdkit.Chem.rdchem.Mol at 0x7ff09dbb85b0>,),)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((isopropanol, ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A couple of things to note about the input and output to the `RunReactants()` method:\n",
    "  1.  The input is a Python _tuple_.  Note the extra parentheses and the trailing comma in the input above.  For the single molecule we have here, it seems confusing, but this format makes it easy to supply multiple molecules into a single reaction.\n",
    "  2.  The output is a tuple of tuples.  The _inner_ tuples are there because even reactions that take only a single input molecule can result in multiple output molecules (e.g. hydrolysis).  The _outer_ tuples are there because rdkit applies your reaction incidence of the appropriate motifs in the input molecule, even if it occurs more than once.  \n",
    "  \n",
    "The upshot of all this is that it can take a bit of indexing to get your molecule out.  Note the trailing `[0][0]` below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7ff09dbb8710>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((isopropanol, ))[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Behold!  We have produced acetone.  Now let's try one of the problematic examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7ff09d95db88>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((t_butanol, ))[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Uh-oh!  RDKit gave us a pentavalent carbon.  That can't be right.  \n",
    "\n",
    "The reason this happens is that by default, the products of `RunReactants` are not sanitized, i.e., rdkit doesn't check to see if they make sense.  We can do that check using `Chem.SanitizeMol()`, and the results match up with chemical common sense."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# acetone can be sanitized, no problems here\n",
    "acetone = rxn_1.RunReactants((isopropanol, ))[0][0]\n",
    "Chem.SanitizeMol(acetone)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7ff09d95dc90>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "acetone"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanitization FAILED!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RDKit ERROR: [15:09:39] \n",
      "RDKit ERROR: \n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: Pre-condition Violation\n",
      "RDKit ERROR: getExplicitValence() called without call to calcExplicitValence()\n",
      "RDKit ERROR: Violation occurred on line 162 in file /scratch/RDKit_git/Code/GraphMol/Atom.cpp\n",
      "RDKit ERROR: Failed Expression: d_explicitValence > -1\n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: \n",
      "RDKit ERROR: [15:09:39] \n",
      "RDKit ERROR: \n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: Pre-condition Violation\n",
      "RDKit ERROR: getExplicitValence() called without call to calcExplicitValence()\n",
      "RDKit ERROR: Violation occurred on line 162 in file /scratch/RDKit_git/Code/GraphMol/Atom.cpp\n",
      "RDKit ERROR: Failed Expression: d_explicitValence > -1\n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: \n",
      "RDKit ERROR: [15:09:39] Explicit valence for atom # 0 C, 5, is greater than permitted\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7ff09d95df50>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#doctest: IGNORE\n",
    "# \"t-butyl ketone\" cannot be sanitized, this is going to give an error\n",
    "crazy_molecule = rxn_1.RunReactants((t_butanol, ))[0][0]\n",
    "try:\n",
    "    Chem.SanitizeMol(crazy_molecule)\n",
    "except ValueError:\n",
    "    print('Sanitization FAILED!')\n",
    "    \n",
    "# Drawing the moecule will create rdkit warning messages that start with `RDKit ERROR:`\n",
    "crazy_molecule"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The warning message is a clue that something is wonky with the \"ketone\" that we created with the reaction. Phenol presents another problematic case for our reaction.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanitization failed.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RDKit ERROR: [15:09:39] \n",
      "RDKit ERROR: \n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: Pre-condition Violation\n",
      "RDKit ERROR: getExplicitValence() called without call to calcExplicitValence()\n",
      "RDKit ERROR: Violation occurred on line 162 in file /scratch/RDKit_git/Code/GraphMol/Atom.cpp\n",
      "RDKit ERROR: Failed Expression: d_explicitValence > -1\n",
      "RDKit ERROR: ****\n",
      "RDKit ERROR: \n",
      "RDKit ERROR: [15:09:40] Can't kekulize mol.  Unkekulized atoms: 2 3 4 5 6\n",
      "RDKit ERROR: \n"
     ]
    }
   ],
   "source": [
    "#doctest: IGNORE\n",
    "# \"phenyl ketone\" cannot be kekulized\n",
    "crazy_molecule = rxn_1.RunReactants((phenol, ))[0][0]\n",
    "try:\n",
    "    Chem.SanitizeMol(crazy_molecule)\n",
    "except ValueError:\n",
    "    print(\"Sanitization failed.\")\n",
    "    \n",
    "# Drawing the molecule will create rdkit warning messages that start with `RDKit ERROR:`,\n",
    "# so we skip it here\n",
    "crazy_molecule = rxn_1.RunReactants((phenol, ))[0][0]\n",
    "# crazy_molecule"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The lesson here is that reactions can create crazy molecules.  This is usually a sign that your reaction is defined too generally.  There are ways to fix that, but for now, let's see what happens with glycerol."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((<rdkit.Chem.rdchem.Mol at 0x7ff09d9813a0>,),\n",
       " (<rdkit.Chem.rdchem.Mol at 0x7ff09d981298>,),\n",
       " (<rdkit.Chem.rdchem.Mol at 0x7ff09d981660>,))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rxn_1.RunReactants((glycerol, ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the ouput is a length-3 tuple of length-1 tuples.  This means that rdkit found three places in the reactant to apply the reaction rule, and each reaction created a single molecule as the product.  This makes sense because glycerol does have three hydroxyl atoms that can be oxidized.  A Pythonic way to look at all these products at once is to unpack the tuples with the `chain.from_iterable()` method from `itertools`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glycerol_products = list(chain.from_iterable(rxn_1.RunReactants((glycerol, ))))\n",
    "[Chem.SanitizeMol(mol) for mol in glycerol_products]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=600x200 at 0x7FF09DB5EA58>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(glycerol_products)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "rdkit does not know about the symmetry of the glycerol molecule, i.e. that oxidizing carbon 1 gives the same molecule as oxidizing carbon 3. So glyceraldehyde appears twice while dihydroxyacetone appears only once.  \n",
    "\n",
    "It can be tricky to reduce sets of molecules to \"unique\" sets of molecules in rdkit.  rdkit molecules are really pointers to locations in memory, so equating two molecules in Python will always give `False`.  Doing the comparison in a simple case like this can be done by converting to SMILES.  Our products are not chiral, but if they were, converting to canonical SMILES would destroy chiral information, so setting `isomericSmiles=True` in the conversion to SMILES is necessary if we'd want to preserve that information.  \n",
    "\n",
    "Once the molecules have been converted to SMILES string representations, we can use Python's `set` object type to keep only the unique objects, and then covert back to rdkit molecules."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=600x200 at 0x7FF09D968CC0>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glycerol_product_smiles = [Chem.MolToSmiles(mol, isomericSmiles=True) for mol in glycerol_products]\n",
    "glycerol_unique_products = [Chem.MolFromSmiles(smiles) for smiles in set(glycerol_product_smiles)]\n",
    "Draw.MolsToGridImage(glycerol_unique_products)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have only the two unique possible products.  It's worth noting that converting molecules to SMILES and then back into rdkit Molecules results in kekulization and sanitization, because unlike molecules created by `RunReactants()`, molecules created by `MolFromSmiles()` are kekulized and sanitized by default."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A better, more specific reaction definition\n",
    "\n",
    "We can fix most of the problems we've experienced with a better-defined SMARTS reaction.  Here's one that will only work on aliphatic primary or secondary alcohols."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "rxn_2 = AllChem.ReactionFromSmarts('[CH:1]([O:2])>>[C:1](=[O:2])')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this version of the reaction, we specify that the alcohol in question must be _aliphatic_ (we've used a capital `C` in the reactant definition above) and additionally that this carbon atom must be bound to at least one hydrogen (the `h`) above.\n",
    "\n",
    "We now apply the reaction to every molecule in our alcohol set and look at all the products."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nyfY7hDUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=600x200 at 0x7FF0D007ECC0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_products_tuples = tuple(rxn_2.RunReactants((mol, )) for mol in alcohols)\n",
    "all_products = list(chain.from_iterable(chain.from_iterable(all_products_tuples)))\n",
    "\n",
    "all_products_smiles = [Chem.MolToSmiles(mol, isomericSmiles=True) for mol in all_products]\n",
    "all_products_unique = [Chem.MolFromSmiles(smiles) for smiles in set(all_products_smiles)]\n",
    "\n",
    "Draw.MolsToGridImage(all_products_unique)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The new reaction definition automatically excludes tertiary alcohols and aryl alchols.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## More complex reactions\n",
    "\n",
    "The same basic ideas can be used to create reactions that involve more than one reactant molecule, or that create more than one product.  The only new idea is that a dot `.` is used in SMARTS reactions definitions to separate molecules in the input or output. \n",
    "\n",
    "Let's continue with the example set of alcohols, and this time eliminate water from them, creating an alkene and a water molecule.  We'll explicitly track both molecules this time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# helper functions to avoid typing the same thing over and over\n",
    "def to_smiles(mol_tuple):\n",
    "    return tuple(Chem.MolToSmiles(mol, isomericSmiles=True) for mol in mol_tuple)\n",
    "\n",
    "def from_smiles(smiles_tuple):\n",
    "    return tuple(Chem.MolFromSmiles(smiles) for smiles in smiles_tuple)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of unique product sets: 5\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAPoCAYAAADwUahJAABJwElEQVR4nO3deXTU9b3/8VcWtiTs\nu4hQFtkRkE0EFKUqCL3tryf+zu8cw/n9Wm+8trcJeqvBVh2LW7jcWye2Lmlt66i9vTee3nuNKCqr\nyCIoIHsQUDbZCVsSlizv3x9zMzplzYeZ+U4mz8c5OUpmmO87kzDPfOf7nc8kmZkJAIA6SvZ6AABA\n/URAAABOCAgAwAkBAQA4ISAAACcEBADghIAAAJwQEACAEwICAHBCQAAATggIAMAJAQEAOCEgAAAn\nBAQA4ISAAACcEBAAgBMCAgBwQkAAAE4ICADACQEBADghIAAAJwQEAOCEgAAAnBAQAIATAgIAcEJA\nAABOCAgAwAkBAQA4ISAAACcEBADghIAAAJwQEACAEwICAHBCQAAATggIAMAJAQEAOCEgAAAnBAQA\n4ISAAACcEBAAgBMCAgBwQkAAAE4ICADACQEBADghIAAAJwQEAOCEgAAAnBAQAIATAgIAcEJAAABO\nCAgAwAkBAQA4ISAAACcEBADghIAAAJwQEACAEwICAHBCQAAATggIAMAJAQEAOCEgAAAnBAQA4ISA\neKCmpkYnT570egwAuCoEJMbef/99DRgwQNOmTfN6FAC4KqleD9BQ7N27V3l5efrLX/4iM1NZWZlK\nS0vVpk0br0cDACfsgUTZyZMnlZubq549e+rf/u3f1Lx5c/n9fu3YsYN4AKjXkszMvB4iEdXU1OjV\nV1/Vk08+qf379ys5OVn33XefnnzySXXu3Nnr8QDgqvEUVhQsW7ZMubm5Wr16tSTp5ptvVkFBgW68\n8UaPJwOAyOEprAjavXu37rnnHo0bN06rV6/Wddddp6KiIn388cfEA0DCYQ8kAs6cOaP8/HzNnj1b\nFRUVatq0qfLy8vTII48oLS3N6/EAICoIyFV6/fXX9dhjj2nPnj2SpKysLD3zzDPq2rWrx5MBQHQR\nEEfr1q3T9OnTtXjxYknSDTfcIL/fr1tvvfWqbre6ulopKSlXPyAARBnHQOro0KFDmjZtmoYNG6bF\nixerQ4cOCgQCWrNmzVXH4+zZsxo4cKByc3N1/PjxiMwLANFCQK7QuXPnNGvWLPXp00dvvPGGUlNT\nlZeXp61bt2ratGlKTr76u/Kjjz7S1q1b9cILL2jAgAF6/fXXxVnWAOIVrwO5Au+++64eeughffHF\nF5Kku+++W7/+9a91/fXXR3xbW7Zs0YMPPqgPPvhAktSvXz89//zzuvPOOyO+LQC4GgTkEjZv3qzc\n3FzNnz9fktS/f38VFBRo4sSJUd/2O++8o9zcXH311VeSpClTpqigoEA9evSI+rYB4ErwFNYFnDhx\nQrm5uRoyZIjmz5+vli1byu/36/PPP49JPCRp6tSpKikpkd/vV/PmzTVnzhz169dPubm5OnXqVExm\nAIBLYQ/kW6qrq/Xb3/5WTz31lI4ePaqUlBT99Kc/1RNPPKG2bdt6Nte+ffv0q1/9Sq+++qpqamp0\nzTXXyOfz6b777ovIsRcAcEFA/sfHH3+s3NxcrV27VpI0btw4FRQUaOjQoR5P9o3PPvtMubm5Wr58\nuSRp+PDhKigo0JgxYzyeDEBD1OB/fd25c6emTp2q8ePHa+3aterevbuKi4u1ZMmSuIqHFAzG0qVL\nVVRUpOuuu06fffaZxo4dq3vuuUe7d+/2ejwADUyD3QMpKyvT008/rRdeeEGnT59WRkaGHnvsMeXk\n5KhZs2Zej3dZ5eXlmj17tmbNmqUzZ84oLS1NDz/8sGbMmKGmTZt6PR6AhsAamJqaGgsEAtalSxeT\nZElJSZaVlWV79+71erQwtXP26tXLdu7cedHr7d6927KyskySSbKuXbtaIBCI4aQAGqoGFZAVK1bY\nyJEjQw+2o0ePtpUrV3o91nk2bNhgEydODM05Y8aMy/6dRYsW2Q033BD6O7feeqt9/vnnMZgWQEPV\nIAKyf/9+y8rKsqSkJJNknTp1skAgYDU1NV6PFuZq56yurrZAIGAdOnQwSZacnGxZWVl28ODBKE8O\noCFK6ICcOXPGfD6fpaenmyRr0qSJ+Xw+Kysr83q0MJGe89ixY5aXl2eNGzc2SdaqVSvLz8+3s2fP\nRnhyAA1ZwgakqKjIevXqFXpKJzMz07Zt2+b1WOeJ5pxbt261u+++O3Tb119/vb3zzjsRuW0ASLiA\nbNiwwW6//fbQg+bAgQNt/vz5Xo91nvXr14fNOWjQoKjNOW/ePBswYEBoWxMnTrSNGzdGZVsAGo6E\nCcjhw4ctOzvbUlNTTZK1a9fOCgsLrbKy0uvRwng157lz58zv91vLli1NkjVq1MhycnLs+PHjUd0u\ngMRV7wNSVVVlfr/f2rRpY5IsNTXVcnJy7OjRo16PFqaysjIu5jxy5Ijl5ORYSkqKSbK2bdua3++3\nqqqqmM4BoP6r1wF5//33rV+/fqGnZu666y7bsmWL12OdZ+7cuda3b9+4mnPNmjU2fvz40ExDhw61\njz76yNOZANQv9TIgO3bssClTpoQe/Hr06GHFxcVej3We+jBncXGxfec73wnNOGXKFPvyyy+9HgtA\nPVCvAnLy5EnLyckJnZ7aokUL8/v9cXd66okTJ+rFnLUqKiosPz/fmjdvbpKsWbNmlpeXZydPnvR6\nNABxrF4EpLq62goLC+2aa64JvUAuOzvbvv76a69HC1M7Z+fOncPm3Ldvn9ejXZGvv/467IWM11xz\njRUWFlp1dbXXowGIQ3EfkGXLltnw4cNDT7GMGTPGPv30U6/HOs/SpUvD5rz55pvjcs4rsWrVKrvp\npptCX8uIESNs2bJlXo8FIM7EbUB27dplmZmZod+Gr7vuOisqKoq75Ufqy5x1VbuYY+3eVFJSkmVm\nZtquXbu8Hg1AnIi7gJw+fTpsWY+mTZuaz+ez8vJyr0cLUztnWlpaXM95tcrKyszn81nTpk1NkqWn\np5vP57PTp097PRoSwWuvmY0aZZaeHvwYNcrsT386/3qXWzi84S0sHhfi6l4PBALWtWvX0FMnWVlZ\ntnv3bq/HOk99mTOSWDYeEfcP/2B2ww1mc+eanTplVlZm9sEHZkOGBC/7NgISl+LiXl+3bp1NmDAh\n9OA0ePBgW7hwoddjnefzzz+3W2+9NTTnDTfcYIsWLfJ6rJhauHChDR48OHQfTJgwwdatW+f1WKhv\n/vu/zfr1C4bjb506Zda3r9nbb3/zOQISlzy91w8ePGhZWVmWnJxskqxDhw4WCATi7qyf+jJnrLBs\nPK7aXXeZ/fu/X/zyv/zFbNKkb/5MQOKSJ/f62bNnLT8/31q3bm2SrHHjxpaXl2elpaVejHNRtXO2\natUqbM5jx455PVpcKC0tDVs2vnXr1iwbjyvTtq3ZpX7h2L/frF27b/5MQOJSzO/1d9991/r06RN6\nCmTy5MlWUlIS6zEua86cOXb99deH5rz77rtt69atXo8Vl0pKSs5bNn7OnDlej4V4lpJidqkFRM+d\nM0tN/ebP0uU/EHMxu9c3bdoU9jat/fv3t3nz5sVq81esvswZj+bNm2f9+/cPWzZ+06ZNXo+FeHS5\nPZADB9gDqQeifq8fP37ccnJyrFGjRibJWrZsaX6/386dOxftTddJfZkz3rFsPK7InXde/hjIXXd9\n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\nbds2SVJmZqaeeeYZ9e7d2+PJpD179uiXv/yl3njjDUlS165d9fTTT2vatGkeTwagoSIgkjZu3Kjp\n06drwYIFkqSBAwfK7/fr9ttv93iy8y1atEjTp0/X+vXrJUkTJkyQ3+/X4MGDPZ4MQEPToI+BHDly\nRPfff7+GDh2qBQsWqF27diosLNTatWvjMh5SMBhr165VIBBQhw4dtGjRIg0dOlTTpk3ToUOHvB4P\nQAPSIANSVVWlgoIC9enTR7/73e8kSTk5Odq6dauys7OVmhofL9A3M73//vvnfT45OVnTpk1TSUmJ\n8vLylJqaqjfeeEN9+vTRrFmzdO7cOQ+mBdDgWAMzd+5c69u3r0kySXbXXXfZli1bvB7rPB999JEN\nHTrUJNlf/vKXS15369atdvfdd4e+puuvv97mzJkTo0kBNFQNZg/kyy+/1NSpUzVp0iSVlJSoR48e\nKi4u1ty5c+PqPTr279+v//f//l/oqarOnTurcePGl/w7119/vebMmaN58+apf//++uKLLzRlyhR9\n97vf1aZNm2I0OYAGx+uCRduJEycsJyfHGjdubJKsRYsW5vf77ezZs16PFubkyZOWl5dnzZo1M0nW\nvHlzy8/Pt4qKijrdzrlz58zv91vLli1NkjVq1MhycnLs+PHjUZocQEOVsAGprq62wsJC69y5s0my\n5ORky87Otn379nk9WpiamhoLBALWpUsXk2RJSUmWlZVle/fuvarbPXLkiOXk5FhKSopJsrZt25rf\n77eqqqoITQ6goUvIgHz88cd24403ho4J3HzzzfbZZ595PdZ5li9fbiNGjAjNedNNN9mqVasiuo01\na9bY+PHjQ9sYOnSoffTRRxHdBoCGKaECsnPnTsvMzLSkpCSTZN26dbOioiKrqanxerQw+/fvt6ys\nrNCcnTp1skAgENU5i4uL7Tvf+U4oJFOmTLEvv/wyatsDkPgSIiAVFRXm8/ksLS3NJFmzZs3M5/NZ\neXm516OFOX36tPl8PktPTzdJ1rRpU/P5fFZWVhaT7VdUVFh+fr41b948dD/l5eXZyZMnY7J9AIml\nXgek9vjBtddeG3b8YM+ePV6Pdp6ioiLr2bNnaA8gMzPTtm3b5skse/fuDdsD6tKlS9T3gAAknnob\nkLVr19ott9wSekAeMmSILV682OuxzrNu3TqbMGFCaM7BgwfbggULvB7LzMxWrVplN910U2i2ESNG\n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\nvQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=400x1000 at 0x7FF09D914320>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "water_elimination_smarts = '[C!H0:1][C:2][O:3]>>[C:1]=[C:2].[O:3]'\n",
    "water_elimination = AllChem.ReactionFromSmarts(water_elimination_smarts)\n",
    "\n",
    "# do the reaction on every alcohol in our set\n",
    "all_products_tuples = [water_elimination.RunReactants((mol, )) for mol in alcohols]\n",
    "all_products = chain.from_iterable(all_products_tuples)\n",
    "\n",
    "# convert to smiles and back to keep only unique products\n",
    "all_products_smiles = [to_smiles(mol_tuple) for mol_tuple in all_products]\n",
    "all_products_unique = [from_smiles(smiles_tuple) for smiles_tuple in set(all_products_smiles)]\n",
    "nProductSets = len(all_products_unique)\n",
    "print(\"Number of unique product sets:\",nProductSets)\n",
    "\n",
    "# draw each product set on its own line\n",
    "prod_tpl = tuple(chain(*all_products_unique))\n",
    "Draw.MolsToGridImage(prod_tpl,molsPerRow=water_elimination.GetNumProductTemplates())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, every reaction produces two compounds, one of which is water.  As before, glycerol gives rise to two _unique_ products.  Phenol does not react because it does not match our reaction rule, which specifies aliphatic carbons.  Unlike the oxidation reaction, $t$-butanol does react, since now it matches the reaction rule, forming isobutylene.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A few other examples\n",
    "\n",
    "### Thiazole synthesis\n",
    "\n",
    "The case we haven't dealt with yet is defining reactions that take more than one molecule as input.  Here's an example of thiazole synthesis from a thiourea and a ketone."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Hantzsch thiazole synthesis\n",
    "thiourea = Chem.MolFromSmiles('CN(C)C(=S)N')\n",
    "haloketone = Chem.MolFromSmiles('c1ccccc1C(=O)C(C)Cl')\n",
    "rxn_smarts = '[NH2:1][C:2](=[S:3])[NH0:4].[C:5](=[O:6])[C:7][Cl:8]>>[N:4][c:2]1[s:3][c:5][c:7][n:1]1'\n",
    "rxn = AllChem.ReactionFromSmarts(rxn_smarts)\n",
    "product = rxn.RunReactants((thiourea, haloketone))[0][0]\n",
    "Chem.SanitizeMol(product)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=600x200 at 0x7FF09D9080F0>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_three = [thiourea, haloketone, product]\n",
    "formulae = [rdMolDescriptors.CalcMolFormula(mol) for mol in all_three]\n",
    "Draw.MolsToGridImage(all_three, legends = formulae)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Two things are worth noting in this case:\n",
    "\n",
    "1. The reaction as we defined it doesn't track all the atoms; a water and a hydrogen chloride disappear given our reaction definition.\n",
    "\n",
    "2. The order in which reactants appear in the tuple(s) supplied to `RunReactants()` matters!  In our reaction definition, the thiourea SMARTS came first, so when feeding in reactants the thiourea should appear in the same slot.  If reactants are supplied in the wrong order, they won't match the reaction rule and no products will result (see below)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "()\n"
     ]
    }
   ],
   "source": [
    "no_products = rxn.RunReactants((haloketone, thiourea))\n",
    "print(no_products)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Copper-catalyzed azide/alkyne cycloaddition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAADICAYAAAA0n5+2AAAb20lEQVR4nO3de3DW1Z3H8U8SwHBH\nIFxWBYkoQUWBiCBJIIEAylJn7BisFtTtrFG7K2pXq46d2k6dlrFdN1RkjTqOoK6arb2giJBAIFwU\nCJSLIhgTUe6aYAmYALl894/f5jFPkgcScp5Lkvdr5szA88vzOyc8l9+Hc87vnCgzMwEA0HJR4W4A\nEKmiw90AAACA9oaABQAA4BgBCwAAwDECFgAAgGMELAAAAMcIWAAAAI4RsAAAABwjYAEAADhGwAIA\nAHCMgAUAAOAYAQsAAMAxAhYAAIBjBCwAAADHCFgAAACOEbAAAAAcI2ABAAA4RsACAABwjIAFAADg\nGAELAADAMQIWAACAYwQsAAAAxwhYAAAAjhGwAAAAHCNgAQAAOEbAAgAAcIyABQAA4BgBCwAAwDEC\nFgAAgGMELAAAAMcIWAAAAI4RsAAAABwjYAEAADhGwAIAAHCMgAUAAOAYAQsAAMAxAhYAAIBjBCwA\nAADHCFgAAACOEbAAAAAcI2ABAAA4RsACAABwjIAFAADgGAELAADAMQIWAACAYwQsAAAAxwhYAAAA\njhGwAAAAHCNgAQAAOEbAAgAAcIyABQAA4BgBCwAAwDECFgAAgGMELAAAAMcIWAAAAI4RsAAAABwj\nYAEAADhGwAIAAHCMgAUAAOAYAQsAAMAxAhYAAIBjBCwAAADHCFgAAACOEbAAAAAcI2ABAAA4RsBq\nJz7++GPV1NSEuxkAAEAtDFh79uzR6dOng9UWnIcXXnhBU6dO1TXXXKOePXsqOTlZjz/+uPLy8nTm\nzJlwNw8AgA4pysysOT9oZho0aJDKyso0evRopaenKz09XUlJSeratWuw24km5OTk6I477lBNTY0G\nDx6sw4cP+x3v16+fJk2apLS0NE2ZMkVXXnmloqKiwtRaAO0QXyhAAM0OWGVlZUpPT9fOnTtVW1vr\ne7xnz55KSUnRlClTlJaWptGjRys6mpHHYHvjjTd01113qaamRs8++6wefvhhnThxQps2bVJeXp7y\n8vK0bds21X95e/TooQkTJvjC8ZgxY3itALQGAQsIoNkBq853332nDz/8UHl5eVq/fr02b96sqqoq\n3/Fu3bpp4sSJvt6t8ePHq3Pnzs4b3pG9+eabmjt3rmpqavT73/9ejzzySJM/9/XXX2vt2rVav369\nNmzY0Chw9ezZU+PHj/cFrrFjx4a8hysrK0tdunRRWlqaRo4cGdK6AbQaAQsIoMUBq6GTJ0/qo48+\notckRP76179q9uzZqqqq0i9/+Uv9+te/bvZzjxw5onXr1vnC8e7du/2Ox8XFKTU1VUlJSUpOTg56\n4DIzDRw4UN98842kyAh8AFqEDygQQKsDVkPffPON1qxZ4+s12bp1q9/xuLg4jR8/XsnJyVxEW2jp\n0qXKyMjQmTNn9OSTT+rpp59u1fkOHz6s9evXKy8vTytXrtS+ffv8jg8cOFCTJk3y9UZeddVVraqv\noaqqKi1ZskT5+flavXp1ozlkl156qdLS0nxzyC666CKn9QNoNb68gQCcB6yG6vea5Obm6osvvvA7\nXv8iPm3aNA0bNiyYzWmzli1bph/+8Ic6c+aMHn/8cf3ud79zXkdJSYkvGC9fvlz79+/3Oz548GBf\nMJ4+fbouvfRSp/XXD3wrVqzQl19+GdL6AbQYAQsIIOgBq6GWXMRvvPFGDRkyJJTNi0irVq3SD37w\nA1VWVurRRx/VM888E5J6S0pKfMOJq1ev1sGDB/2Ox8fH+4YTg/FataT+mTNn6uKLL3ZaP4BzImAB\nATQrYL3++usaOHCgkpKS1K1bN6cNqLuI5uXlafXq1SorK/M7Hh8f75uTk5aWpv79+zutP9Ll5+dr\n1qxZqqio0E9/+lMtXLgwbEOq9V+rVatW6dixY37H616rpKQkTZ061fmQXnPrT09P15QpU9SvXz+n\n9QNohIAFBHDOgFVTU6N+/frp+PHjiomJ0YgRI3w9TNOmTVOfPn2cNaa6ulqbN29Wfn6+8vPztXHj\nRlVWVvqODxgwQEeOHOkwc7bWrl2rmTNnqqKiQvfdd58WLVoUMb97VVWV32v14Ycf+r1WMTExSkxM\n1C233KLRo0crJSVF3bt3d1Z/TU2N9uzZow0bNvjmkB0/ftx3PDo6WgkJCUF7rwKQRMACAjpnwDp5\n8qR+85vfKD8/X9u2bfPbjiU2NlY33HCDbyKy6yUZampqtH37dt8wUVxcnF555RVn549kmzZt0vTp\n01VeXq577rlH2dnZEROumlL3WtUN/9YFnuTkZK1fvz7ogaf+e6Xu/XLq1Cnf8ZiYGN8CuUlJSUpN\nTVXPnj2d1Q90UJH7pQSEWYvmYFVWVmrr1q2+XoOCggK/7Vg6deqka6+91jdMk5ycrNjY2KA0vD3b\n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\npBUr/I/NmSO98YaUlCQ9+KB0yy3enK3mqq6W/vIX6bnnpHXrvq9/6lRv+PCf/1mKoM69iHTmzBkt\nX75cFRUVGj58uMaNGxfuJjnX1JBgVlaWi3X3CFhAIBah9u7dawUFBWGr/+jRo5aTk2Pz5s2zxMRE\ni4qK8rvVv0ePHpaenm7z58+3wsJCq2lwH315ebndcMMNviUJ9u/fH6bfpP07dOiQ5eTkWGZmpg0d\nOrTR8iH1l+/Yt29fuJvr56GHzHr0MN/SDCNHmi1aZHbiRMvP9dlnZo89Ztanj3euYcPMqqvdt7k9\nKSoqsjFjxpgki42NNUmWkJBgWVlZ7Wb5lJ07d1pCQoJJsu7du9vixYtdnj7st8JTKJFaIqYHK9LV\n30exqV6TuLg4jR8/XsnJyZo4caKeeOIJbdiwQcOGDdOaNWs0ZMiQMLW8Y6mtrdXOnTt9w88FBQV+\ny4dER0fr66+/Vr9+/cLYSn+nTkk5OdIf/iDt2uU9FhsrZWR4yzyMGtWy85WWSi+9JPXtK917r/v2\nthfvvvuu7r77bh07dkyXXHKJZsyYoffee09HjhyR5O0GcO+99+ree+91vk1YqARhSLAherCAQAzn\nZffu3fb888/brbfeanFxcY16TSTZoEGDbM+ePeFuaodXf4HcyZMnh7s5Z7VunVlGhlmnTubr1UpK\nMsvJMauqCnfr2oeKigq/RTV/9KMf+RadrampsaVLl1p6erqv1zo6OtrS09Nt6dKlVltbG+bWN09T\nC4dWVFQEo6qw9xJQKJFaZHCiuLjYFi9ebJmZmdanTx/r3LmzvfLKK+FuFtqogwfNnnrKrF8/8wWt\nYcPM5s83Ky0NXr3t/RuhqKjIxo4da5Ksa9euZx0u27Nnj82bN89vJ4Arrrgi4ocPgzwk2FDYL2IU\nSqQWGZx74oknTJI98sgj4W4K2rjKSrPFi82uucZ8QSs21mzuXLOdO93X156/Ed5++23r1auXSbLh\nw4fb1q1bm/W848ePW1ZWlg0bNswXtHr16mWZmZn2acO9kMIsOzvbN5ds1KhRoWhf2C9iFEqkFhmc\nW7NmjUmyq6++OtxNQTsSiuHDlnwjrF3bNoYtT58+bZmZmb5wNHv2bDt+/HiLz1NTU2O5ubk2a9as\niBs+DOGQYENhv4hRKJFaZHCuqqrKevfubZIietNptE1NDR/+0z95j9UfPpTMZswwa+q6X/+TX3eO\n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\nTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=600x200 at 0x7FF09D908BE0>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diyne_smiles = 'C#CCC(O)C#C'\n",
    "azide_smiles = 'CCCN=[N+]=[N-]'\n",
    "\n",
    "diyne = Chem.MolFromSmiles(diyne_smiles)\n",
    "azide = Chem.MolFromSmiles(azide_smiles)\n",
    "\n",
    "Draw.MolsToGridImage([diyne, azide])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# define reaction\n",
    "copper_click_smarts = '''\n",
    "[CH:1]#[C:2].[N:3]=[N+:4]=[N-:5]>>\n",
    "[c:1]1[c:2][n-0:3][n-0:4][n-0:5]1.\n",
    "[c:2]1[c:1][n-0:3][n-0:4][n-0:5]1\n",
    "'''\n",
    "\n",
    "copper_click = AllChem.ReactionFromSmarts(copper_click_smarts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\\require{mhchem}$\n",
    "Most varieties of the copper click work on terminal alkynes.  That presents a problem if we want to represent the variable regioselectivity (sometimes 1,4-disubstituted triazoles result, and sometimes 1,5-disubstituted triazoles result), because in the reactions SMARTS each carbon must be labeled with a specified & unique number.  So defining a reactant as something like `'([CH:1]#[C:2],[CH:2]#[C:1])'`, meaning that atom numbering is either $\\ce{H-^1C^#^2C-R}$ **or** $\\ce{H-^2C^#^1C-R}$) is NOT allowed.\n",
    "\n",
    "Here, we solve the problem by letting the reaction form two products, the first of which is the 1,4 product and the second of which is the 1,5 product."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE,\n",
       " rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "products_tuples = copper_click.RunReactants((diyne, azide))\n",
    "products = list(chain.from_iterable(products_tuples))\n",
    "[Chem.SanitizeMol(prod) for prod in products]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n8OAE5NQpZZX1VauA7GzlIDV2rLKoVevW5omZiIhKV3KyUpSemAi8/bYyJbsppKWlYdWqVVi2bBn2\n79+PvLw8AICrqyvGjBkDX19fdO7cmbWCRGSVmIDkc+YMUL++sjjVvfzzj9Lj8fvvQF6eMrXvc88B\nb7wBeHiYL1YiIjKN/fuBnj2VxqW1a4Hhw0vnefPygMjIeCxdGoh169Yh7X/z/trZ2cHb2xtjx47F\n8OHDUfFRxgETEZUhTEDuQaNRFiWcNMn4Ph8fYPVqJfEYN04ZM/zYY6qFSUREJvD558Brrymrph88\n+OgNTCLAjh3KQrgbNwKOjrm4etUFGk0e+vfvDx8fHzzzzDOoXLlyaYZPRGTRmIDcg0ajjAH+8Udl\nhhT9fUeOKCukz5p1934iIrIuIsCwYUBEhDI8d9euh/v9+HhgxQrlkn+V9WbNAD+/1Rg61AuNGzcu\nzZCJiMoMJiD3oNEoB43XXgM2bQK0WuU+/rWIiGzDjRvAmDFKvV+7dg/e/soVZTrfZcuA6Oi793t4\nAOPHA6NHA48/brJwiYjKDCYg96BPNr74Qhm3+9prTECIiMjYrVvAypVK0rF/v3K8AAB3d+DZZ4EJ\nEwAvL3VjJCKyNExA7kGfbIgAAwcCn30GtGzJBISIyNbcqyZQBBg8WOklBwB7e+Dpp5X6wGHDABcX\nNaIlIrJ89moHYOk0GuD775VWLCIisk3Llil1gQVr/0aPvjtBydChQKVK6sRHRFSWsAfkHgoOt1q6\nVJlul38tIiLbwppAIqLSxQSEiIjoPlgTSERUurjEKhERUTHMmAFs3248rS4RET089oAQERHdR/7e\njrg4pSZwzx72gBARPSr2gBARERVTgwZKPSARET069oAQEREREZHZsAeEiIiIiIjMhgkIERERERGZ\nDRMQIiIiIiIyGyYgRERERERkNkxAiIiIiIjIbJiAEBERERGR2TABISIiIiIis2ECQkREREREZsME\nhIiIiIiIzIYJCBERERERmQ0TECIiIiIiMhsmIEREREREZDZMQIiIiIiIyGyYgBARERERkdkwASEi\nIiIiIrNhAkJERERERGbDBISIiIiIiMyGCQgREREREZkNExAiIiIiIjIbJiBERERERGQ2TECIiIiI\niMhsmIAQEREREZHZMAEhIiIiIiKzYQJCRERERERmwwSEiIiIiIjMhgkIERERERGZDRMQIiIiIiIy\nGyYgRERERERkNkxAiIiIiIjIbJiAEBERERGR2TABISIiIiIis2ECQkREREREZsMEhIiIiIiIzIYJ\nCBERERERmQ0TECIiIiIiMhsmIEREREREZDZMQIiIiIiIyGyYgBARERERkdn8P0h20wXELw0uAAAA\nAElFTkSuQmCC\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGBA size=800x200 at 0x7FF09D908668>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Draw.MolsToGridImage(products, molsPerRow = 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reaction rule, as we saw above with glycerol, is only executed once per species.  So \"reactive\" groups remain in the output molecules.  Some simple Python scripting could then react these molecules again, generating the (bis)-triazoles.\n",
    "\n",
    "For more complex editing and manipulation of molecules, it might be worthwhile to investigate [RWMol objects](http://www.rdkit.org/Python_Docs/rdkit.Chem.rdchem.RWMol-class.html) instead of or in addition to the SMARTS reactions examples illustrated here."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "tutorial author: Curt Fischer, Jan 2017"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
